package com.codeyang.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.codeyang.constant.ProdTagConstant;
import com.codeyang.domain.ProdTag;
import com.codeyang.domain.ProdTagReference;
import com.codeyang.mapper.ProdTagMapper;
import com.codeyang.mapper.ProdTagReferenceMapper;
import com.codeyang.service.ProdTagService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * 描述: TO-删除标志-DO
 *
 * @author CodeYang_Site
 * @version 2021/5/24 22:34
 */

@CacheConfig(cacheNames = "com.codeyang.service.impl.ProdTagServiceImpl")
@Slf4j
@Service
public class ProdTagServiceImpl extends ServiceImpl<ProdTagMapper, ProdTag> implements ProdTagService {


    @Autowired
    private ProdTagReferenceMapper prodTagReferenceMapper;


    @Autowired
    private ProdTagMapper prodTagMapper;


    /**
     * 新增标签分组
     *
     * @param @prodTag
     * @return
     */
    @Caching(evict = {
            @CacheEvict(key = ProdTagConstant.PROD_TAG_PREFIX),
            @CacheEvict(key = ProdTagConstant.PROD_FRONT_TAG_PREFIX)})
    @Override
    public boolean save(ProdTag prodTag) {
        log.info("新增标签分组{}", JSON.toJSONString(prodTag));
        prodTag.setCreateTime(new Date());
        prodTag.setUpdateTime(new Date());
        prodTag.setShopId(1L);
        return super.save(prodTag);
    }

    /**
     * 全查询商品标签分组
     *
     * @return
     */

    @Override
    @Cacheable(key = ProdTagConstant.PROD_TAG_PREFIX)
    public List<ProdTag> list() {
        List<ProdTag> prodTags = prodTagMapper.selectList(new LambdaQueryWrapper<ProdTag>()
                .eq(ProdTag::getStatus, 1)
                .orderByDesc(ProdTag::getSeq)
        );
        return prodTags;
    }


    /**
     * 删除商品的标签
     *
     * @param id
     * @return
     */
    @Caching(evict = {
            @CacheEvict(key = ProdTagConstant.PROD_TAG_PREFIX),
            @CacheEvict(key = ProdTagConstant.PROD_FRONT_TAG_PREFIX)})
    @Override
    public boolean removeById(Serializable id) {
        log.info("删除商品标签的分组id为{}", id);

        // 删除之前查询,标签是否正在被使用,使用就不能删除
        Integer count = prodTagReferenceMapper.selectCount(new LambdaQueryWrapper<ProdTagReference>()
                .eq(ProdTagReference::getTagId, id)
        );
        if (count > 0) {
            log.error("有商品正在使用此标签分组，不能删除");
            throw new IllegalArgumentException("有商品正在使用此标签分组，不能删除");
        }
        return super.removeById(id);
    }


    /**
     * 获取商品分组标签并缓存
     *
     * @return
     */
    @Override
    public List<ProdTag> loadFrontProteanList() {
        List<ProdTag>  prodTags=  prodTagMapper.selectFrontTagList();
        if (CollectionUtils.isEmpty(prodTags)){
            return null;
        }
        return prodTags;
    }
}
